package com.viewshine.webservicedemo.client;

import com.viewshine.webservicedemo.entity.Dog;
import com.viewshine.webservicedemo.service.TestService;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

import javax.xml.namespace.QName;
import java.lang.reflect.Method;

/**
 * @ClassName CxfClient
 * @Author rhb
 * @Description webservice 客户端调用
 *                  该类提供两种不同的方式来调用webservice服务
 *                  1：代理工厂方式
 *                  2：动态调用webservice
 * @Date 2019-01-16 16:23
 * @Version 1.0
 **/
public class CxfClient {

    public static void main(String[] args) throws Exception {
//        main1();
//        main2();
    }

    /**
     * 1：代理工厂方式
     */
    public static void main1() {
        try {
            // 接口地址
            String address = "http://127.0.0.1:8080/soap/user?wsdl";
            // 代理工厂
            JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
            // 设置代理地址
            jaxWsProxyFactoryBean.setAddress(address);
            // 设置接口类型
            jaxWsProxyFactoryBean.setServiceClass(TestService.class);
            // 创建一个代理接口实现
            TestService testService = (TestService) jaxWsProxyFactoryBean.create();


            Dog test = testService.getOne(2);

            System.out.println("返回结果:" + test);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 2：动态调用
     */
    public static void main2() {
        // 创建动态客户端
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient("http://127.0.0.1:8080/soap/user?wsdl");
        // 需要密码的情况需要加上用户名和密码
        // client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME, PASS_WORD));
        Object[] objects = new Object[0];
        try {

            /** 情况1：没有@WebService(serviceName = "TestService"....)等等注解应用直接使用以下方法*/
//             invoke("方法名",参数1,参数2,参数3....);
            objects = client.invoke("getOne", 1);
            System.out.println("返回数据:" + objects[0]);


            /** 情况2：有@WebService(serviceName = "TestService"....)等等注解应用使用以下方法；【执行时报错异常，尚未解决】*/
            QName operationName = new QName("com.viewshine.webservicedemo.service.TestService","a"); //如果有命名空间需要加上这个，第一个参数为命名空间名称，第二个参数为WebService方法名称
            objects = client.invoke(operationName,99);//后面为WebService请求参数数组
            System.out.println("返回数据:" + objects[0]);

        } catch (java.lang.Exception e) {
            e.printStackTrace();
        }
    }

}
